package com.rchat.pocmini.session;

import android.content.Context;
import android.content.SharedPreferences;

import com.airtalkee.sdk.AirtalkeeSessionManager;
import com.airtalkee.sdk.OnMediaListener;
import com.airtalkee.sdk.OnSessionListener;
import com.airtalkee.sdk.entity.AirContact;
import com.airtalkee.sdk.entity.AirSession;
import com.rchat.pocmini.util.SPUtil;

import java.util.List;

import static android.content.Context.MODE_PRIVATE;

/**
 * Created by ljd on 2017/2/6.
 * <p>
 * 负责所有临时会话和频道会话相关的操作.
 */

public class PocAirtalkeeSessionManager implements PocAirtalkeeSessionManagerInterface {

    private static AirtalkeeSessionManager airTalkeeSessionManager = AirtalkeeSessionManager.getInstance();
    private static PocAirtalkeeSessionManager pocAirtalkeeSessionManager;
    private SharedPreferences settings;
    private boolean isSpInited = false;

    public String getLockedSessionId() {
        return lockedSessionId;
    }

    public void setLockedSessionId(String lockedSessionId) {
        this.lockedSessionId = lockedSessionId;
    }

    private String lockedSessionId;

    public AirSession getLockedAirSession() {
        return lockedAirSession;
    }

    public void setLockedAirSession(AirSession lockedAirSession, Context context) {

        this.lockedAirSession = lockedAirSession;
        if (!isSpInited) {
            settings = context.getSharedPreferences(SPUtil.FILE_NAME, MODE_PRIVATE);
        }
        if (lockedAirSession != null) {
            settings.edit().putString(SPUtil.SPKeyGlobal.KEY_LOCKEDCHANNEL, lockedAirSession.getSessionCode()).apply();
        } else {
            settings.edit().putString(SPUtil.SPKeyGlobal.KEY_LOCKEDCHANNEL, "").apply();
        }
    }

    private AirSession lockedAirSession;

    //======== 会话应答模式 ========
    public static final int INCOMING_MODE_AUTO = AirSession.INCOMING_MODE_AUTO;
    public static final int INCOMING_MODE_MANUALLY = AirSession.INCOMING_MODE_MANUALLY;


    public String getLockSessionId() {
        return lockSessionId;
    }

    public void setLockSessionId(String lockSessionId) {
        this.lockSessionId = lockSessionId;
    }

    public String lockSessionId;

    private PocAirtalkeeSessionManager() {
    }

    /**
     * 获取AirtalkeeSessionManager实例
     *
     * @return airTalkeeSessionManager
     */
    public static PocAirtalkeeSessionManager getPocAirtalkeeSessionManagerInstance() {
        if (pocAirtalkeeSessionManager == null) {
            pocAirtalkeeSessionManager = new PocAirtalkeeSessionManager();
        }
        return pocAirtalkeeSessionManager;
    }


//     AudioModeGet此方法找不到
//    /**
//     * 获取音频设备模式
//     * @param context 应用上下文
//     * @return
//     */
//    @Override
//    public int getAudioMode(Context context){
//
//    }

//     AudioModeSet此方法找不到
//    /**
//     * 设置音频设备模式
//     * @param context 应用上下文
//     * @param int AudioManager对象的常量参数如：MODE_NORMAL、MODE_IN_CALL
//     * @return
//     */
//    @Override
//    public void setAudioMode(Context context,int mode){
//
//    }

    /**
     * 发起对一个人或多个人的临时呼叫，或进入频道会话
     *
     * @param contacts 被叫的列表
     * @return AirSession，此会话的实例
     */
    @Override
    public AirSession sessionCall(List<AirContact> contacts) {
        return airTalkeeSessionManager.SessionCall(contacts);
    }

    /**
     * 发起对一个人或多个人的临时呼叫，或进入频道会话
     *
     * @param channelId 欲进入的频道ID
     * @return AirSession，此会话的实例
     */
    @Override
    public AirSession sessionCall(String channelId) {
        return airTalkeeSessionManager.SessionCall(channelId);
    }

    /**
     * 结束制定的临时呼叫，或取消正在呼叫的临时呼叫，或退出频道会话
     *
     * @param session 制定的会话实例
     */
    @Override
    public void sessionBye(AirSession session) {
        airTalkeeSessionManager.SessionBye(session);
    }

    /**
     * 接听临时呼叫来电
     *
     * @param session 制定的会话实例
     */
    @Override
    public void sessionIncomingAccept(AirSession session) {
        airTalkeeSessionManager.SessionIncomingAccept(session);
    }

    /**
     * 拒绝临时呼叫来电
     *
     * @param session 指定的会话实例
     */
    @Override
    public void sessionIncomingReject(AirSession session) {
        airTalkeeSessionManager.SessionIncomingReject(session);
    }

    //=============== 会话中邀请加入 ================
    //1.此接口仅支持在临时会话中邀请其他用户
    //2.邀请加入的会话应是当前已接通的会话
    //3.被加入的用户会作为临时会话被叫处理

    /**
     * 邀请他人加入制定临时会话
     *
     * @param sessionCode 临时会话的ID
     * @param memberIds   邀请加入的用户ID列表
     */
    @Override
    public void sessionCallJoin(String sessionCode, List<String> memberIds) {
        airTalkeeSessionManager.SessionCallJoin(sessionCode, memberIds);
    }

    /**
     * 在会话中申请话语权
     *
     * @param session 制定的会话实例
     */
    @Override
    public boolean talkRequest(AirSession session) {
        return airTalkeeSessionManager.TalkRequest(session);
    }

    /**
     * 在会话中申请话语权
     *
     * @param session 指定的会话实例
     * @param toGrap  指定是否抢断他人话语权（用户必须拥有比当前讲话人更高的优先级，
     *                才可抢断，否则将会作为一般申请话语权的动作处理）
     */
    @Override
    public boolean talkRequest(AirSession session, boolean toGrap) {
        return airTalkeeSessionManager.TalkRequest(session, toGrap);
    }


    /**
     * 在会话中释放话语权
     *
     * @param session 制定的会话实例
     */
    @Override
    public void talkRelease(AirSession session) {
        airTalkeeSessionManager.TalkRelease(session);
    }

    /**
     * 此接口专门为通过点击PTT按钮而设计，SDK会自动记录PTT按钮的状态，
     * 从而无需UI关心，SDK将会通过OnMediaListener.onMediaButtonState自动通知UI，
     * PTT按钮应该是什么状态。
     *
     * @param session
     */
    @Override
    public void talkButtonClick(AirSession session) {
        airTalkeeSessionManager.TalkButtonClick(session);
    }

    /**
     * 设置应答模式
     *
     * @param mode 应答模式
     */
    @Override
    public void setSessionDialogAnswerMode(int mode) {
        airTalkeeSessionManager.setSessionDialogSetAnswerMode(mode);
    }

    /**
     * 设置免打扰模式
     *
     * @param isb true为免打扰开启
     */
    @Override
    public void setSessionDialogIsbMode(boolean isb) {
        airTalkeeSessionManager.setSessionDialogSetIsbMode(isb);
    }

    //=========== 开启或关闭本地录制 ==========//
    //通过AirtalkeeSessionManager的以下接口可实现开启或关闭音频的本地录制，录制的本地文件会自动
    //保存在AirtalkeeMessage中setMessageRecordPath（String recordPath）
    //接口所设置的路径下。
    //本地录制的事件将跟随实时通话的话语权结束后发生，
    //如关心此事件需调用AirtalkeeMessage中的setOnMessagePttListener
    //方法设置Listener实例（OnMessagePttListener）

    /**
     * 开启实时音频的本地录制，事件返回OnMessagePttListener.onMessagePttRecord
     */
    @Override
    public void mediaRealtimeRecordEnable() {
        airTalkeeSessionManager.MediaRealtimeRecordEnable();
    }

    /**
     * 关闭实时音频的本地录制,事件返回OnMessagePttListener.onMessagePttRecord
     */
    @Override
    public void mediaRealtimeRecordDisable() {
        airTalkeeSessionManager.MediaRealtimeRecordDisable();
    }

    /**
     * 开启或关闭实时音频的本地录制
     *
     * @param isEnable true开启，false关闭
     */
    @Override
    public void setSessionLocalRecordEnable(boolean isEnable) {
        if (isEnable) {
            airTalkeeSessionManager.MediaRealtimeRecordEnable();
        } else {
            airTalkeeSessionManager.MediaRealtimeRecordDisable();
        }
    }

    /**
     * 设置监听器
     *
     * @param listener 监听器
     */
    @Override
    public void setListener(PocAirtalkeeSessionListener listener) {
        airTalkeeSessionManager.setOnSessionListener(listener);
        airTalkeeSessionManager.setOnSessionIncomingListener(listener);
        airTalkeeSessionManager.setOnMediaListener(listener);
    }

    public void setOnMediaListener(OnMediaListener listener) {
        airTalkeeSessionManager.setOnMediaListener(listener);
    }

    public void setOnSessionListener(OnSessionListener listener) {
        airTalkeeSessionManager.setOnSessionListener(listener);
    }

    public void setHeartBeat(int hbSeconds, int hbNatSize) {
        airTalkeeSessionManager.setMediaEngineSetting(hbSeconds, hbNatSize);
    }
}
